/**
  * @file    servo_motor.h
  * @author  LiuDongPeng
  * @version V0.1
  * @date    2022-12-25
  * @brief   舵机模块头文件
  *
  * @attention
  * 使用此bmp280模块, 用户需提供一个周期为20ms, 0.5ms~2.5ms时长的有效电平可调的定时器PWM输出通道, 例如:
  * STM32F103系列, 72MHz主频, 定时器PSC设置为72 - 1, ARR设置为20000 - 1,
  * STM32F407系列, 168MHz主频, 定时器PSC设置为168 - 1, ARR设置为20000 - 1
  *
  * @changelog
  * 2023-1-5	修改变量, 函数等的命名风格为小写字母加下划线组合
  */

#ifndef F103_TEST_SERVOMOTOR_H
#define F103_TEST_SERVOMOTOR_H


#include <stdint.h>
#include <stddef.h>


#ifdef __cplusplus
extern "C" {
#endif


/**
 * @brief 舵机对象结构体定义
 * @note 用户需提供一个周期为20ms, 0.5ms~2.5ms时长的有效电平可调的定时器PWM输出通道, 例如:
 * STM32F103系列, 72MHz主频, 定时器PSC设置为72 - 1, ARR设置为20000 - 1
 * STM32F407系列, 168MHz主频, 定时器PSC设置为168 - 1, ARR设置为20000 - 1
 */
typedef struct servo_motor
{

	/* 舵机当前角度 */
	float angle;

	/* 输出PWM波的定时器的ARR值 */
	int tim_arr;

	/**
	 * @brief 由用户实现设置TIM CCR寄存器值的接口
	 * @param[in]	ccr
	 * @return
	 */
	int (*set_tim_ccr)(uint16_t ccr);

	/**
	 * @brief 启动PWM输出
	 * @return
	 */
	int (*pwm_start)();

	/**
	 * @brief 停止PWM输出
	 * @return
	 */
	int (*pwm_stop)();

} servo_motor_t;


typedef int (*pwm_start_t)();
typedef int (*pwm_stop_t)();
typedef int (*set_tim_ccr_t)(uint16_t ccr);



int servo_motor_create(servo_motor_t* servo, pwm_start_t pwm_start, pwm_stop_t pwm_stop, set_tim_ccr_t set_tim_ccr);

int servo_motor_init(servo_motor_t* servo);

int servo_motor_start(servo_motor_t* servo);

int servo_motor_stop(servo_motor_t* servo);

int servo_motor_set_angle(servo_motor_t* servo, float angle);

float servo_motor_get_angle(servo_motor_t* servo);



#ifdef __cplusplus
}
#endif

#endif //F103_TEST_SERVOMOTOR_H
